{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "pdf-title"
    ]
   },
   "source": [
    "# Convolutional Networks\n",
    "So far we have worked with deep fully-connected networks, using them to explore different optimization strategies and network architectures. Fully-connected networks are a good testbed for experimentation because they are very computationally efficient, but in practice all state-of-the-art results use convolutional networks instead.\n",
    "\n",
    "First you will implement several layer types that are used in convolutional networks. You will then use these layers to train a convolutional network on the CIFAR-10 dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [],
   "source": [
    "# As usual, a bit of setup\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from cs231n.classifiers.cnn import *\n",
    "from cs231n.data_utils import get_CIFAR10_data\n",
    "from cs231n.gradient_check import eval_numerical_gradient_array, eval_numerical_gradient\n",
    "from cs231n.layers import *\n",
    "from cs231n.fast_layers import *\n",
    "from cs231n.solver import Solver\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots\n",
    "plt.rcParams['image.interpolation'] = 'nearest'\n",
    "plt.rcParams['image.cmap'] = 'gray'\n",
    "\n",
    "# for auto-reloading external modules\n",
    "# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "def rel_error(x, y):\n",
    "  \"\"\" returns relative error \"\"\"\n",
    "  return np.max(np.abs(x - y) / (np.maximum(1e-8, np.abs(x) + np.abs(y))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train:  (49000, 3, 32, 32)\n",
      "y_train:  (49000,)\n",
      "X_val:  (1000, 3, 32, 32)\n",
      "y_val:  (1000,)\n",
      "X_test:  (1000, 3, 32, 32)\n",
      "y_test:  (1000,)\n"
     ]
    }
   ],
   "source": [
    "# Load the (preprocessed) CIFAR10 data.\n",
    "\n",
    "data = get_CIFAR10_data()\n",
    "for k, v in data.items():\n",
    "  print('%s: ' % k, v.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive forward pass\n",
    "The core of a convolutional network is the convolution operation. In the file `cs231n/layers.py`, implement the forward pass for the convolution layer in the function `conv_forward_naive`. \n",
    "\n",
    "You don't have to worry too much about efficiency at this point; just write the code in whatever way you find most clear.\n",
    "\n",
    "You can test your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_naive\n",
      "difference:  2.2121476417505994e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "w_shape = (3, 3, 4, 4)\n",
    "x = np.linspace(-0.1, 0.5, num=np.prod(x_shape)).reshape(x_shape)\n",
    "w = np.linspace(-0.2, 0.3, num=np.prod(w_shape)).reshape(w_shape)\n",
    "b = np.linspace(-0.1, 0.2, num=3)\n",
    "\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "out, _ = conv_forward_naive(x, w, b, conv_param)\n",
    "correct_out = np.array([[[[-0.08759809, -0.10987781],\n",
    "                           [-0.18387192, -0.2109216 ]],\n",
    "                          [[ 0.21027089,  0.21661097],\n",
    "                           [ 0.22847626,  0.23004637]],\n",
    "                          [[ 0.50813986,  0.54309974],\n",
    "                           [ 0.64082444,  0.67101435]]],\n",
    "                         [[[-0.98053589, -1.03143541],\n",
    "                           [-1.19128892, -1.24695841]],\n",
    "                          [[ 0.69108355,  0.66880383],\n",
    "                           [ 0.59480972,  0.56776003]],\n",
    "                          [[ 2.36270298,  2.36904306],\n",
    "                           [ 2.38090835,  2.38247847]]]])\n",
    "\n",
    "# Compare your output to ours; difference should be around e-8\n",
    "print('Testing conv_forward_naive')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Aside: Image processing via convolutions\n",
    "\n",
    "As fun way to both check your implementation and gain a better understanding of the type of operation that convolutional layers can perform, we will set up an input containing two images and manually set up filters that perform common image processing operations (grayscale conversion and edge detection). The convolution forward pass will apply these operations to each of the input images. We can then visualize the results as a sanity check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": [
     "pdf-ignore-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from imageio import imread\n",
    "from PIL import Image\n",
    "\n",
    "kitten = imread('notebook_images/kitten.jpg')\n",
    "puppy = imread('notebook_images/puppy.jpg')\n",
    "# kitten is wide, and puppy is already square\n",
    "d = kitten.shape[1] - kitten.shape[0]\n",
    "kitten_cropped = kitten[:, d//2:-d//2, :]\n",
    "\n",
    "img_size = 200   # Make this smaller if it runs too slow\n",
    "resized_puppy = np.array(Image.fromarray(puppy).resize((img_size, img_size)))\n",
    "resized_kitten = np.array(Image.fromarray(kitten_cropped).resize((img_size, img_size)))\n",
    "x = np.zeros((2, 3, img_size, img_size))\n",
    "x[0, :, :, :] = resized_puppy.transpose((2, 0, 1))\n",
    "x[1, :, :, :] = resized_kitten.transpose((2, 0, 1))\n",
    "\n",
    "# Set up a convolutional weights holding 2 filters, each 3x3\n",
    "w = np.zeros((2, 3, 3, 3))\n",
    "\n",
    "# The first filter converts the image to grayscale.\n",
    "# Set up the red, green, and blue channels of the filter.\n",
    "w[0, 0, :, :] = [[0, 0, 0], [0, 0.3, 0], [0, 0, 0]]\n",
    "w[0, 1, :, :] = [[0, 0, 0], [0, 0.6, 0], [0, 0, 0]]\n",
    "w[0, 2, :, :] = [[0, 0, 0], [0, 0.1, 0], [0, 0, 0]]\n",
    "\n",
    "# Second filter detects horizontal edges in the blue channel.\n",
    "w[1, 2, :, :] = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]]\n",
    "\n",
    "# Vector of biases. We don't need any bias for the grayscale\n",
    "# filter, but for the edge detection filter we want to add 128\n",
    "# to each output so that nothing is negative.\n",
    "b = np.array([0, 128])\n",
    "\n",
    "# Compute the result of convolving each input in x with each filter in w,\n",
    "# offsetting by b, and storing the results in out.\n",
    "out, _ = conv_forward_naive(x, w, b, {'stride': 1, 'pad': 1})\n",
    "\n",
    "def imshow_no_ax(img, normalize=True):\n",
    "    \"\"\" Tiny helper to show images as uint8 and remove axis labels \"\"\"\n",
    "    if normalize:\n",
    "        img_max, img_min = np.max(img), np.min(img)\n",
    "        img = 255.0 * (img - img_min) / (img_max - img_min)\n",
    "    plt.imshow(img.astype('uint8'))\n",
    "    plt.gca().axis('off')\n",
    "\n",
    "# Show the original images and the results of the conv operation\n",
    "plt.subplot(2, 3, 1)\n",
    "imshow_no_ax(puppy, normalize=False)\n",
    "plt.title('Original image')\n",
    "plt.subplot(2, 3, 2)\n",
    "imshow_no_ax(out[0, 0])\n",
    "plt.title('Grayscale')\n",
    "plt.subplot(2, 3, 3)\n",
    "imshow_no_ax(out[0, 1])\n",
    "plt.title('Edges')\n",
    "plt.subplot(2, 3, 4)\n",
    "imshow_no_ax(kitten_cropped, normalize=False)\n",
    "plt.subplot(2, 3, 5)\n",
    "imshow_no_ax(out[1, 0])\n",
    "plt.subplot(2, 3, 6)\n",
    "imshow_no_ax(out[1, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive backward pass\n",
    "Implement the backward pass for the convolution operation in the function `conv_backward_naive` in the file `cs231n/layers.py`. Again, you don't need to worry too much about computational efficiency.\n",
    "\n",
    "When you are done, run the following to check your backward pass with a numeric gradient check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_backward_naive function\n",
      "dx error:  1.159803161159293e-08\n",
      "dw error:  2.2471264748452487e-10\n",
      "db error:  3.37264006649648e-11\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(4, 3, 5, 5)\n",
    "w = np.random.randn(2, 3, 3, 3)\n",
    "b = np.random.randn(2,)\n",
    "dout = np.random.randn(4, 2, 5, 5)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_forward_naive(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_forward_naive(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_forward_naive(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "out, cache = conv_forward_naive(x, w, b, conv_param)\n",
    "dx, dw, db = conv_backward_naive(dout, cache)\n",
    "\n",
    "# Your errors should be around e-8 or less.\n",
    "print('Testing conv_backward_naive function')\n",
    "print('dx error: ', rel_error(dx, dx_num))\n",
    "print('dw error: ', rel_error(dw, dw_num))\n",
    "print('db error: ', rel_error(db, db_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive forward\n",
    "Implement the forward pass for the max-pooling operation in the function `max_pool_forward_naive` in the file `cs231n/layers.py`. Again, don't worry too much about computational efficiency.\n",
    "\n",
    "Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_forward_naive function:\n",
      "difference:  4.1666665157267834e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "x = np.linspace(-0.3, 0.4, num=np.prod(x_shape)).reshape(x_shape)\n",
    "pool_param = {'pool_width': 2, 'pool_height': 2, 'stride': 2}\n",
    "\n",
    "out, _ = max_pool_forward_naive(x, pool_param)\n",
    "\n",
    "correct_out = np.array([[[[-0.26315789, -0.24842105],\n",
    "                          [-0.20421053, -0.18947368]],\n",
    "                         [[-0.14526316, -0.13052632],\n",
    "                          [-0.08631579, -0.07157895]],\n",
    "                         [[-0.02736842, -0.01263158],\n",
    "                          [ 0.03157895,  0.04631579]]],\n",
    "                        [[[ 0.09052632,  0.10526316],\n",
    "                          [ 0.14947368,  0.16421053]],\n",
    "                         [[ 0.20842105,  0.22315789],\n",
    "                          [ 0.26736842,  0.28210526]],\n",
    "                         [[ 0.32631579,  0.34105263],\n",
    "                          [ 0.38526316,  0.4       ]]]])\n",
    "\n",
    "# Compare your output with ours. Difference should be on the order of e-8.\n",
    "print('Testing max_pool_forward_naive function:')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive backward\n",
    "Implement the backward pass for the max-pooling operation in the function `max_pool_backward_naive` in the file `cs231n/layers.py`. You don't need to worry about computational efficiency.\n",
    "\n",
    "Check your implementation with numeric gradient checking by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_backward_naive function:\n",
      "dx error:  3.27562514223145e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(3, 2, 8, 8)\n",
    "dout = np.random.randn(3, 2, 4, 4)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: max_pool_forward_naive(x, pool_param)[0], x, dout)\n",
    "\n",
    "out, cache = max_pool_forward_naive(x, pool_param)\n",
    "dx = max_pool_backward_naive(dout, cache)\n",
    "\n",
    "# Your error should be on the order of e-12\n",
    "print('Testing max_pool_backward_naive function:')\n",
    "print('dx error: ', rel_error(dx, dx_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fast layers\n",
    "Making convolution and pooling layers fast can be challenging. To spare you the pain, we've provided fast implementations of the forward and backward passes for convolution and pooling layers in the file `cs231n/fast_layers.py`.\n",
    "\n",
    "The fast convolution implementation depends on a Cython extension; to compile it you need to run the following from the `cs231n` directory:\n",
    "\n",
    "```bash\n",
    "python setup.py build_ext --inplace\n",
    "```\n",
    "\n",
    "The API for the fast versions of the convolution and pooling layers is exactly the same as the naive versions that you implemented above: the forward pass receives data, weights, and parameters and produces outputs and a cache object; the backward pass recieves upstream derivatives and the cache object and produces gradients with respect to the data and weights.\n",
    "\n",
    "**NOTE:** The fast implementation for pooling will only perform optimally if the pooling regions are non-overlapping and tile the input. If these conditions are not met then the fast pooling implementation will not be much faster than the naive implementation.\n",
    "\n",
    "You can compare the performance of the naive and fast versions of these layers by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_fast:\n",
      "Naive: 5.211808s\n",
      "Fast: 0.016665s\n",
      "Speedup: 312.731144x\n",
      "Difference:  4.926407851494105e-11\n",
      "\n",
      "Testing conv_backward_fast:\n",
      "Naive: 8.547677s\n",
      "Fast: 0.009948s\n",
      "Speedup: 859.255009x\n",
      "dx difference:  1.949764775345631e-11\n",
      "dw difference:  3.681156828004736e-13\n",
      "db difference:  3.481354613192702e-14\n"
     ]
    }
   ],
   "source": [
    "# Rel errors should be around e-9 or less\n",
    "from cs231n.fast_layers import conv_forward_fast, conv_backward_fast\n",
    "from time import time\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 31, 31)\n",
    "w = np.random.randn(25, 3, 3, 3)\n",
    "b = np.random.randn(25,)\n",
    "dout = np.random.randn(100, 25, 16, 16)\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = conv_forward_naive(x, w, b, conv_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = conv_forward_fast(x, w, b, conv_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing conv_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('Difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive, dw_naive, db_naive = conv_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast, dw_fast, db_fast = conv_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting conv_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))\n",
    "print('dw difference: ', rel_error(dw_naive, dw_fast))\n",
    "print('db difference: ', rel_error(db_naive, db_fast))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing pool_forward_fast:\n",
      "Naive: 0.365957s\n",
      "fast: 0.002110s\n",
      "speedup: 173.438983x\n",
      "difference:  0.0\n",
      "\n",
      "Testing pool_backward_fast:\n",
      "Naive: 1.003142s\n",
      "fast: 0.010598s\n",
      "speedup: 94.652254x\n",
      "dx difference:  0.0\n"
     ]
    }
   ],
   "source": [
    "# Relative errors should be close to 0.0\n",
    "from cs231n.fast_layers import max_pool_forward_fast, max_pool_backward_fast\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 32, 32)\n",
    "dout = np.random.randn(100, 3, 16, 16)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = max_pool_forward_naive(x, pool_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = max_pool_forward_fast(x, pool_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing pool_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive = max_pool_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast = max_pool_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting pool_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolutional \"sandwich\" layers\n",
    "Previously we introduced the concept of \"sandwich\" layers that combine multiple operations into commonly used patterns. In the file `cs231n/layer_utils.py` you will find sandwich layers that implement a few commonly used patterns for convolutional networks. Run the cells below to sanity check they're working."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu_pool\n",
      "dx error:  9.591132621921372e-09\n",
      "dw error:  5.802391137330214e-09\n",
      "db error:  1.0146343411762047e-09\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_pool_forward, conv_relu_pool_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 16, 16)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "out, cache = conv_relu_pool_forward(x, w, b, conv_param, pool_param)\n",
    "dx, dw, db = conv_relu_pool_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu_pool')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu:\n",
      "dx error:  1.5218619980349303e-09\n",
      "dw error:  2.702022646099404e-10\n",
      "db error:  1.451272393591721e-10\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_forward, conv_relu_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 8, 8)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "out, cache = conv_relu_forward(x, w, b, conv_param)\n",
    "dx, dw, db = conv_relu_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_forward(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_forward(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_forward(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu:')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Three-layer ConvNet\n",
    "Now that you have implemented all the necessary layers, we can put them together into a simple convolutional network.\n",
    "\n",
    "Open the file `cs231n/classifiers/cnn.py` and complete the implementation of the `ThreeLayerConvNet` class. Remember you can use the fast/sandwich layers (already imported for you) in your implementation. Run the following cells to help you debug:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sanity check loss\n",
    "After you build a new network, one of the first things you should do is sanity check the loss. When we use the softmax loss, we expect the loss for random weights (and no regularization) to be about `log(C)` for `C` classes. When we add regularization the loss should go up slightly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "log(C): 2.302585092994046\n",
      "Initial loss (no regularization):  2.302583314261004\n",
      "Initial loss (with regularization):  2.5083968860717265\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet()\n",
    "\n",
    "N = 50\n",
    "X = np.random.randn(N, 3, 32, 32)\n",
    "y = np.random.randint(10, size=N)\n",
    "\n",
    "print('log(C):', np.log(10))\n",
    "\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (no regularization): ', loss)\n",
    "\n",
    "model.reg = 0.5\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (with regularization): ', loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gradient check\n",
    "After the loss looks reasonable, use numeric gradient checking to make sure that your backward pass is correct. When you use numeric gradient checking you should use a small amount of artifical data and a small number of neurons at each layer. Note: correct implementations may still have relative errors up to the order of e-2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W1 max relative error: 1.380104e-04\n",
      "W2 max relative error: 1.822723e-02\n",
      "W3 max relative error: 3.064049e-04\n",
      "b1 max relative error: 3.477652e-05\n",
      "b2 max relative error: 2.516375e-03\n",
      "b3 max relative error: 7.945660e-10\n"
     ]
    }
   ],
   "source": [
    "num_inputs = 2\n",
    "input_dim = (3, 16, 16)\n",
    "reg = 0.0\n",
    "num_classes = 10\n",
    "np.random.seed(231)\n",
    "X = np.random.randn(num_inputs, *input_dim)\n",
    "y = np.random.randint(num_classes, size=num_inputs)\n",
    "\n",
    "model = ThreeLayerConvNet(num_filters=3, filter_size=3,\n",
    "                          input_dim=input_dim, hidden_dim=7,\n",
    "                          dtype=np.float64)\n",
    "loss, grads = model.loss(X, y)\n",
    "# Errors should be small, but correct implementations may have\n",
    "# relative errors up to the order of e-2\n",
    "for param_name in sorted(grads):\n",
    "    f = lambda _: model.loss(X, y)[0]\n",
    "    param_grad_num = eval_numerical_gradient(f, model.params[param_name], verbose=False, h=1e-6)\n",
    "    e = rel_error(param_grad_num, grads[param_name])\n",
    "    print('%s max relative error: %e' % (param_name, rel_error(param_grad_num, grads[param_name])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Overfit small data\n",
    "A nice trick is to train your model with just a few training samples. You should be able to overfit small datasets, which will result in very high training accuracy and comparatively low validation accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 30) loss: 2.414060\n",
      "(Epoch 0 / 15) train acc: 0.200000; val_acc: 0.137000\n",
      "(Iteration 2 / 30) loss: 3.102925\n",
      "(Epoch 1 / 15) train acc: 0.140000; val_acc: 0.087000\n",
      "(Iteration 3 / 30) loss: 2.270330\n",
      "(Iteration 4 / 30) loss: 2.096705\n",
      "(Epoch 2 / 15) train acc: 0.240000; val_acc: 0.094000\n",
      "(Iteration 5 / 30) loss: 1.838880\n",
      "(Iteration 6 / 30) loss: 1.934188\n",
      "(Epoch 3 / 15) train acc: 0.510000; val_acc: 0.173000\n",
      "(Iteration 7 / 30) loss: 1.827912\n",
      "(Iteration 8 / 30) loss: 1.639574\n",
      "(Epoch 4 / 15) train acc: 0.520000; val_acc: 0.188000\n",
      "(Iteration 9 / 30) loss: 1.330082\n",
      "(Iteration 10 / 30) loss: 1.756115\n",
      "(Epoch 5 / 15) train acc: 0.630000; val_acc: 0.167000\n",
      "(Iteration 11 / 30) loss: 1.024162\n",
      "(Iteration 12 / 30) loss: 1.041826\n",
      "(Epoch 6 / 15) train acc: 0.750000; val_acc: 0.229000\n",
      "(Iteration 13 / 30) loss: 1.142777\n",
      "(Iteration 14 / 30) loss: 0.835706\n",
      "(Epoch 7 / 15) train acc: 0.790000; val_acc: 0.247000\n",
      "(Iteration 15 / 30) loss: 0.587786\n",
      "(Iteration 16 / 30) loss: 0.645509\n",
      "(Epoch 8 / 15) train acc: 0.820000; val_acc: 0.252000\n",
      "(Iteration 17 / 30) loss: 0.786844\n",
      "(Iteration 18 / 30) loss: 0.467054\n",
      "(Epoch 9 / 15) train acc: 0.820000; val_acc: 0.178000\n",
      "(Iteration 19 / 30) loss: 0.429880\n",
      "(Iteration 20 / 30) loss: 0.635498\n",
      "(Epoch 10 / 15) train acc: 0.900000; val_acc: 0.206000\n",
      "(Iteration 21 / 30) loss: 0.365807\n",
      "(Iteration 22 / 30) loss: 0.284220\n",
      "(Epoch 11 / 15) train acc: 0.820000; val_acc: 0.201000\n",
      "(Iteration 23 / 30) loss: 0.469343\n",
      "(Iteration 24 / 30) loss: 0.509369\n",
      "(Epoch 12 / 15) train acc: 0.920000; val_acc: 0.211000\n",
      "(Iteration 25 / 30) loss: 0.111638\n",
      "(Iteration 26 / 30) loss: 0.145388\n",
      "(Epoch 13 / 15) train acc: 0.930000; val_acc: 0.213000\n",
      "(Iteration 27 / 30) loss: 0.155575\n",
      "(Iteration 28 / 30) loss: 0.143398\n",
      "(Epoch 14 / 15) train acc: 0.960000; val_acc: 0.212000\n",
      "(Iteration 29 / 30) loss: 0.158160\n",
      "(Iteration 30 / 30) loss: 0.118934\n",
      "(Epoch 15 / 15) train acc: 0.990000; val_acc: 0.220000\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "\n",
    "num_train = 100\n",
    "small_data = {\n",
    "  'X_train': data['X_train'][:num_train],\n",
    "  'y_train': data['y_train'][:num_train],\n",
    "  'X_val': data['X_val'],\n",
    "  'y_val': data['y_val'],\n",
    "}\n",
    "\n",
    "model = ThreeLayerConvNet(weight_scale=1e-2)\n",
    "# print(model.get_shape())\n",
    "solver = Solver(model, small_data,\n",
    "                num_epochs=15, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=1)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plotting the loss, training accuracy, and validation accuracy should show clear overfitting:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.subplot(2, 1, 1)\n",
    "plt.plot(solver.loss_history, 'o')\n",
    "plt.xlabel('iteration')\n",
    "plt.ylabel('loss')\n",
    "\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(solver.train_acc_history, '-o')\n",
    "plt.plot(solver.val_acc_history, '-o')\n",
    "plt.legend(['train', 'val'], loc='upper left')\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the net\n",
    "By training the three-layer convolutional network for one epoch, you should achieve greater than 40% accuracy on the training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 980) loss: 2.304740\n",
      "(Epoch 0 / 1) train acc: 0.103000; val_acc: 0.107000\n",
      "(Iteration 21 / 980) loss: 2.277595\n",
      "(Iteration 41 / 980) loss: 2.105168\n",
      "(Iteration 61 / 980) loss: 1.955614\n",
      "(Iteration 81 / 980) loss: 1.901870\n",
      "(Iteration 101 / 980) loss: 1.786646\n",
      "(Iteration 121 / 980) loss: 1.607626\n",
      "(Iteration 141 / 980) loss: 1.901893\n",
      "(Iteration 161 / 980) loss: 1.900993\n",
      "(Iteration 181 / 980) loss: 1.974500\n",
      "(Iteration 201 / 980) loss: 1.930574\n",
      "(Iteration 221 / 980) loss: 2.061199\n",
      "(Iteration 241 / 980) loss: 1.680599\n",
      "(Iteration 261 / 980) loss: 1.758424\n",
      "(Iteration 281 / 980) loss: 1.987053\n",
      "(Iteration 301 / 980) loss: 1.756236\n",
      "(Iteration 321 / 980) loss: 1.879092\n",
      "(Iteration 341 / 980) loss: 1.813254\n",
      "(Iteration 361 / 980) loss: 2.129946\n",
      "(Iteration 381 / 980) loss: 1.438068\n",
      "(Iteration 401 / 980) loss: 1.829907\n",
      "(Iteration 421 / 980) loss: 1.524082\n",
      "(Iteration 441 / 980) loss: 1.729550\n",
      "(Iteration 461 / 980) loss: 1.840234\n",
      "(Iteration 481 / 980) loss: 1.830851\n",
      "(Iteration 501 / 980) loss: 1.595853\n",
      "(Iteration 521 / 980) loss: 2.126786\n",
      "(Iteration 541 / 980) loss: 1.692218\n",
      "(Iteration 561 / 980) loss: 1.839294\n",
      "(Iteration 581 / 980) loss: 1.495706\n",
      "(Iteration 601 / 980) loss: 1.655335\n",
      "(Iteration 621 / 980) loss: 1.683438\n",
      "(Iteration 641 / 980) loss: 1.742117\n",
      "(Iteration 661 / 980) loss: 1.828452\n",
      "(Iteration 681 / 980) loss: 1.860717\n",
      "(Iteration 701 / 980) loss: 1.546998\n",
      "(Iteration 721 / 980) loss: 1.541053\n",
      "(Iteration 741 / 980) loss: 1.745391\n",
      "(Iteration 761 / 980) loss: 1.678145\n",
      "(Iteration 781 / 980) loss: 2.111524\n",
      "(Iteration 801 / 980) loss: 1.900898\n",
      "(Iteration 821 / 980) loss: 1.668368\n",
      "(Iteration 841 / 980) loss: 1.589296\n",
      "(Iteration 861 / 980) loss: 1.778009\n",
      "(Iteration 881 / 980) loss: 1.700346\n",
      "(Iteration 901 / 980) loss: 1.685917\n",
      "(Iteration 921 / 980) loss: 1.775121\n",
      "(Iteration 941 / 980) loss: 1.903952\n",
      "(Iteration 961 / 980) loss: 1.671379\n",
      "(Epoch 1 / 1) train acc: 0.446000; val_acc: 0.464000\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet(weight_scale=0.001, hidden_dim=500, reg=0.001)\n",
    "\n",
    "solver = Solver(model, data,\n",
    "                num_epochs=1, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=20)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize Filters\n",
    "You can visualize the first-layer convolutional filters from the trained network by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from cs231n.vis_utils import visualize_grid\n",
    "\n",
    "grid = visualize_grid(model.params['W1'].transpose(0, 2, 3, 1))\n",
    "plt.imshow(grid.astype('uint8'))\n",
    "plt.axis('off')\n",
    "plt.gcf().set_size_inches(5, 5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Spatial Batch Normalization\n",
    "We already saw that batch normalization is a very useful technique for training deep fully-connected networks. As proposed in the original paper (link in `BatchNormalization.ipynb`), batch normalization can also be used for convolutional networks, but we need to tweak it a bit; the modification will be called \"spatial batch normalization.\"\n",
    "\n",
    "Normally batch-normalization accepts inputs of shape `(N, D)` and produces outputs of shape `(N, D)`, where we normalize across the minibatch dimension `N`. For data coming from convolutional layers, batch normalization needs to accept inputs of shape `(N, C, H, W)` and produce outputs of shape `(N, C, H, W)` where the `N` dimension gives the minibatch size and the `(H, W)` dimensions give the spatial size of the feature map.\n",
    "\n",
    "If the feature map was produced using convolutions, then we expect every feature channel's statistics e.g. mean, variance to be relatively consistent both between different images, and different locations within the same image -- after all, every feature channel is produced by the same convolutional filter! Therefore spatial batch normalization computes a mean and variance for each of the `C` feature channels by computing statistics over the minibatch dimension `N` as well the spatial dimensions `H` and `W`.\n",
    "\n",
    "\n",
    "[1] [Sergey Ioffe and Christian Szegedy, \"Batch Normalization: Accelerating Deep Network Training by Reducing\n",
    "Internal Covariate Shift\", ICML 2015.](https://arxiv.org/abs/1502.03167)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for spatial batch normalization in the function `spatial_batchnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [9.33463814 8.90909116 9.11056338]\n",
      "  Stds:  [3.61447857 3.19347686 3.5168142 ]\n",
      "After spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [ 6.18949336e-16  5.99520433e-16 -1.22124533e-16]\n",
      "  Stds:  [0.99999962 0.99999951 0.9999996 ]\n",
      "After spatial batch normalization (nontrivial gamma, beta):\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [6. 7. 8.]\n",
      "  Stds:  [2.99999885 3.99999804 4.99999798]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "\n",
    "print('Before spatial batch normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', x.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones(C), np.zeros(C)\n",
    "bn_param = {'mode': 'train'}\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to beta and stds close to gamma\n",
    "gamma, beta = np.asarray([3, 4, 5]), np.asarray([6, 7, 8])\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization (nontrivial gamma, beta):')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "After spatial batch normalization (test-time):\n",
      "  means:  [-0.08034406  0.07562881  0.05716371  0.04378383]\n",
      "  stds:  [0.96718744 1.0299714  1.02887624 1.00585577]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the test-time forward pass by running the training-time\n",
    "# forward pass many times to warm up the running averages, and then\n",
    "# checking the means and variances of activations after a test-time\n",
    "# forward pass.\n",
    "N, C, H, W = 10, 4, 11, 12\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "gamma = np.ones(C)\n",
    "beta = np.zeros(C)\n",
    "for t in range(50):\n",
    "  x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "  spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "bn_param['mode'] = 'test'\n",
    "x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "a_norm, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "\n",
    "# Means should be close to zero and stds close to one, but will be\n",
    "# noisier than training-time forward passes.\n",
    "print('After spatial batch normalization (test-time):')\n",
    "print('  means: ', a_norm.mean(axis=(0, 2, 3)))\n",
    "print('  stds: ', a_norm.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_batchnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  2.786648201640115e-07\n",
      "dgamma error:  7.0974817113608705e-12\n",
      "dbeta error:  3.275608725278405e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(C)\n",
    "beta = np.random.randn(C)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "fx = lambda x: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fg = lambda a: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fb = lambda b: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "#You should expect errors of magnitudes between 1e-12~1e-06\n",
    "_, cache = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "dx, dgamma, dbeta = spatial_batchnorm_backward(dout, cache)\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Group Normalization\n",
    "In the previous notebook, we mentioned that Layer Normalization is an alternative normalization technique that mitigates the batch size limitations of Batch Normalization. However, as the authors of [2] observed, Layer Normalization does not perform as well as Batch Normalization when used with Convolutional Layers:\n",
    "\n",
    ">With fully connected layers, all the hidden units in a layer tend to make similar contributions to the final prediction, and re-centering and rescaling the summed inputs to a layer works well. However, the assumption of similar contributions is no longer true for convolutional neural networks. The large number of the hidden units whose\n",
    "receptive fields lie near the boundary of the image are rarely turned on and thus have very different\n",
    "statistics from the rest of the hidden units within the same layer.\n",
    "\n",
    "The authors of [3] propose an intermediary technique. In contrast to Layer Normalization, where you normalize over the entire feature per-datapoint, they suggest a consistent splitting of each per-datapoint feature into G groups, and a per-group per-datapoint normalization instead. \n",
    "\n",
    "![Comparison of normalization techniques discussed so far](notebook_images/normalization.png)\n",
    "<center>**Visual comparison of the normalization techniques discussed so far (image edited from [3])**</center>\n",
    "\n",
    "Even though an assumption of equal contribution is still being made within each group, the authors hypothesize that this is not as problematic, as innate grouping arises within features for visual recognition. One example they use to illustrate this is that many high-performance handcrafted features in traditional Computer Vision have terms that are explicitly grouped together. Take for example Histogram of Oriented Gradients [4]-- after computing histograms per spatially local block, each per-block histogram is normalized before being concatenated together to form the final feature vector.\n",
    "\n",
    "You will now implement Group Normalization. Note that this normalization technique that you are to implement in the following cells was introduced and published to ECCV just in 2018 -- this truly is still an ongoing and excitingly active field of research!\n",
    "\n",
    "[2] [Ba, Jimmy Lei, Jamie Ryan Kiros, and Geoffrey E. Hinton. \"Layer Normalization.\" stat 1050 (2016): 21.](https://arxiv.org/pdf/1607.06450.pdf)\n",
    "\n",
    "\n",
    "[3] [Wu, Yuxin, and Kaiming He. \"Group Normalization.\" arXiv preprint arXiv:1803.08494 (2018).](https://arxiv.org/abs/1803.08494)\n",
    "\n",
    "\n",
    "[4] [N. Dalal and B. Triggs. Histograms of oriented gradients for\n",
    "human detection. In Computer Vision and Pattern Recognition\n",
    "(CVPR), 2005.](https://ieeexplore.ieee.org/abstract/document/1467360/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Group normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for group normalization in the function `spatial_groupnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [9.72505327 8.51114185 8.9147544  9.43448077]\n",
      "  Stds:  [3.67070958 3.09892597 4.27043622 3.97521327]\n",
      "After spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [-7.40148683e-18  1.11022302e-17  1.23049719e-16  1.29526020e-17]\n",
      "  Stds:  [0.99999834 0.99999782 0.99999873 0.99999691]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "x_g = x.reshape((N*G,-1))\n",
    "print('Before spatial group normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x_g.mean(axis=1))\n",
    "print('  Stds: ', x_g.std(axis=1))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones((1,C,1,1)), np.zeros((1,C,1,1))\n",
    "bn_param = {'mode': 'train'}\n",
    "\n",
    "out, _ = spatial_groupnorm_forward(x, gamma, beta, G, bn_param)\n",
    "out_g = out.reshape((N*G,-1))\n",
    "print('After spatial group normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out_g.mean(axis=1))\n",
    "print('  Stds: ', out_g.std(axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial group normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_groupnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  5.069505905384412e-08\n",
      "dgamma error:  3.891606265500656e-12\n",
      "dbeta error:  1.3112820990521168e-11\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(1,C,1,1)\n",
    "beta = np.random.randn(1,C,1,1)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "gn_param = {}\n",
    "fx = lambda x: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fg = lambda a: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fb = lambda b: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "_, cache = spatial_groupnorm_forward(x, gamma, beta, G, gn_param)\n",
    "dx, dgamma, dbeta = spatial_groupnorm_backward(dout, cache)\n",
    "#You should expect errors of magnitudes between 1e-12~1e-07\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
